import arbori.ArboreFunctional;
import arbori.Nod;
import functii.*;
import operatori.*;
import visitor.*;

public class Main {
	public static void main(String args[])
	{
		Nod plus=new Plus();
		Nod xn=new Necunoscuta();
		Nod ct=new Constanta(5);
		
		plus.setFStang(xn);
		plus.setFDrept(ct);
		
		ArboreFunctional a=new ArboreFunctional(plus);
        Visitor v=new ToStringVisitor();
        Visitor v1=new DerivareVisitor();
        a.acceptVisitor(v);
        a.acceptVisitor(v1);
        System.out.println("Functia: "+((ToStringVisitor)v).getS());
        System.out.println("Derivata functiei: "+((DerivareVisitor)v1).getRezultat());
        
      //exemplu cu Sin: f(x)=sin(x+1)
		Nod n7=new Necunoscuta();
		Nod c7=new Constanta(1);
		Nod plus4=new Plus();
		plus4.setFStang(n7);
		plus4.setFDrept(c7);
		Nod sin=new Sin();
		sin.setFStang(plus4);
		
		ArboreFunctional b=new ArboreFunctional(sin);
        Visitor v2=new ToStringVisitor();
        Visitor v3=new DerivareVisitor();
        b.acceptVisitor(v2);
        b.acceptVisitor(v3);
        System.out.println("Functia: "+((ToStringVisitor)v2).getS());
        System.out.println("Derivata functiei: "+((DerivareVisitor)v3).getRezultat());
        
      //exemplu cu Produs: f(x)=(x+3.0)*(x-5)
		Nod n2=new Necunoscuta();
		Nod c2=new Constanta(3);	
		Nod plus2=new Plus();
		plus2.setFStang(n2);
		plus2.setFDrept(c2);
		
		Nod n3=new Necunoscuta();
		Nod c3=new Constanta(5);	
		Nod minus=new Minus();
		minus.setFStang(n3);
		minus.setFDrept(c3);
		
		Nod produs=new Produs();		
		produs.setFStang(plus2);
		produs.setFDrept(minus);
		
		ArboreFunctional a2=new ArboreFunctional(produs);
		Visitor v5=new ToStringVisitor();
        Visitor v6=new DerivareVisitor();
        a2.acceptVisitor(v5);
        a2.acceptVisitor(v6);
        System.out.println("Functia: "+((ToStringVisitor)v5).getS());
        System.out.println("Derivata functiei: "+((DerivareVisitor)v6).getRezultat());
	
        
}
}
